/**
主要回顾：值传递与值交换

值传递：调用一个方法时，传递给方法的参数实际上是传递变量所存储的值

值交换：
    1.对于基本类型，交换的是局部变量
    2.对于引用类型，交换的是指向的对象
*/

import java.util.*;
class LearnArgPassing {
    public static void main(String[] args) {
        int a = 3;
        int b = 5;
        
        exchange(a, b);
        System.out.println("In Main a = " + a + " b = " + b);    //交换不成功
        
        int[] arr = {1, 2, 3};        //还可以是其他引用类型，比如对象
        exchangeArr(arr, 1, 2);
        System.out.println("In Main " + Arrays.toString(arr));    //交换成功
    }
    
    //对于基本类型，形式参数传递过来的是变量的值
    public static void exchange(int a, int b){
        //这里的 a、b 是独立的局部变量，与外面无关
        int temp = a;
        a = b;
        b = temp;
        System.out.println("In exchange a = " + a + " b = " + b);    //交换成功
    }
    
    //对于引用类型，形式参数传递过来的是变量的值，而引用变量的值其实就是指向对象的地址
    public static void exchangeArr(int[] arr, int index1, int index2){
        //这里的 arr 其实也是一个局部变量，但它指向的是跟外面同一个地址
        int temp = arr[index1];
        arr[index1] = arr[index2];
        arr[index2] = temp;
        System.out.println("In exchangeArr " + Arrays.toString(arr));//交换成功
    }
}